#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

#include "led.h"

void led_init(void)
{
    GPIO_InitTypeDef  gpio_init_struct;

    gpio_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;
    gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
    RCC_APB2PeriphResetCmd(LED_RCC, ENABLE);
    gpio_init_struct.GPIO_Pin = LED1_PIN;
    GPIO_Init(LED_PORT, &gpio_init_struct);

    gpio_init_struct.GPIO_Pin = LED2_PIN;
    GPIO_Init(LED_PORT, &gpio_init_struct);
}

void led_on(enum xled_num led)
{
    if ( led == LED_1 ) {
        GPIO_WriteBit(LED_PORT, LED1_PIN, Bit_SET);
    } else if ( led == LED_2 ) {
        GPIO_WriteBit(LED_PORT, LED2_PIN, Bit_SET);
    } else {
        GPIO_WriteBit(LED_PORT, LED1_PIN, Bit_SET);
        GPIO_WriteBit(LED_PORT, LED2_PIN, Bit_SET);
    }
}

void led_off(enum xled_num led)
{
    if ( led == LED_1 ) {
        GPIO_WriteBit(LED_PORT, LED1_PIN, Bit_RESET);
    } else if ( led == LED_2 ) {
        GPIO_WriteBit(LED_PORT, LED2_PIN, Bit_RESET);
    } else {
        GPIO_WriteBit(LED_PORT, LED1_PIN, Bit_RESET);
        GPIO_WriteBit(LED_PORT, LED2_PIN, Bit_RESET);
    }
}

void led_toggle(enum xled_num led)
{
    u8 temp;
    u16 pin_num;
    if ( led == LED_1 ) {
        pin_num = LED1_PIN;
    } else {
        pin_num = LED2_PIN;
    }
    temp = GPIO_ReadOutputDataBit(LED_PORT, pin_num);
    if (temp ^=temp) {
        GPIO_WriteBit(LED_PORT, pin_num, Bit_SET);
    } else {
        GPIO_WriteBit(LED_PORT, pin_num, Bit_RESET);
    }
}